package com.cskaoyan.javase.array._5variable;

/**
 * 可变参数(variable parameter)定义方法的形参列表中,它是形参的一种特殊形式
 * 语法:
 * [修饰符列表] 返回值类型 方法名 (形式参数列表,数据类型... 变量名){
 *   //方法体
 * }
 * 其中"数据类型... 变量名"表示可变参数
 * 形参中存在可变参数,那么就允许方法在调用时,传入不同个数的,对应类型的实参
 *
 * 可变参数的实质是对应数据类型的数组,在方法体中可变参数就可以直接当成数组去处理它
 *
 * @since 11:27
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        // 可变参数的实质是数组,所以仍然能够用数组作为参数传入方法,但是既然用了可变参数,建议尽量不要用这种方式调用方法
        System.out.println(sum(arr));
        // 使用以下方式调用可变参数方法
        System.out.println(sum(1));
        System.out.println(sum(1, 2));
        System.out.println(sum(1, 2, 3));
        System.out.println(sum(1, 2, 3, 4));
        System.out.println(sum(1, 2, 3, 4, 5));
    }

    // 需求: 求不确定个数的int数值之和
    /*public static int sum(int[] arr) {
        // 求数组中元素的和
        int sumValue = 0;
        for (int ele : arr) {
            sumValue += ele;
        }
        return sumValue;
    }*/

    /*
        需求2: 仍然是求不确定个数的int数值之和
        但是要求允许在传入参数时,可以自由的输入不确定个数的参数
        也就是说在调用方法时,输入两个int数,就求两个数的和
        输入三个数,就求三个数的和
        ...
        这种需求就需要可变参数来完成了.
      */
    public static int sum(int... var) {
        // 求数组中元素的和
        int sumValue = 0;
        for (int ele : var) {
            sumValue += ele;
        }
        return sumValue;
    }
}
